<!DOCTYPE html>
<html>

<head>
  <title>Quarkus - Architecture</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/guides/architecture" />
  <meta property="og:title" content="Quarkus - Architecture" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/guides/architecture">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="guides">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="active">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="guide">
  <div class="width-12-12">
    <h1 class="text-caps">Quarkus - Architecture</h1>
    <div class="hide-mobile toc"><ul class="sectlevel1">
<li><a href="#application-architecture">Application Architecture</a></li>
<li><a href="#extension-architecture">Extension Architecture</a></li>
</ul></div>
    <div>
      <div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>image::images/architecture-phases.png</p>
</div>
<div class="paragraph">
<p>Quarkus has an architecture that does as much processing as possible at build time. Annotations and other descriptors
are processed as early as possible, and then Quarkus will generate bytecode based on this information. This results
in lower memory usage and faster startup speeds at runtime.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="application-architecture"><a class="anchor" href="#application-architecture"></a>Application Architecture</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This means that a Quarkus based application will go through a few different distinct phases, each of which can
potentially be executed in a different JVM. These phases are:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Augmentation</dt>
<dd>
<p>This involves processing all the metadata that is present in the application and its libraries, such as annotations,
descriptors etc, and processing this information to create bytecode that is executable at runtime. This generated bytecode
will directly start the runtime services that were represented by the metadata. For example if your application contains
a <code>@WebServlet</code> annotation this phase will output the bytecode required to start Undertow and register this Servlet.
The end result of this phase is a runnable application that should be equivalent to manually wiring up the runtime
services you require, without any of the deployment time code present.</p>
</dd>
<dt class="hdlist1">JVM Startup</dt>
<dd>
<p>When running as a normal JVM application the bytecode generated in the augmentation phase will be executed to start the
runtime services needed by the application. In production mode this will generally be in a different JVM instance, which
means that none of the classes needed by the augmentation phase will be loaded at runtime, resulting in a smaller memory
footprint and faster startup time. In development mode this will be the same JVM, allowing for the application to be
quickly restarted when changes are made.</p>
</dd>
<dt class="hdlist1">Native Image Build</dt>
<dd>
<p>When building a native image with SubstrateVM any code that is part of a static initializer is run as part of the native
image build process, and the results are directly stored in memory. Quarkus takes advantage of this by generating
some of the startup code in static initializer blocks, so they are run as part of the image build process rather than
on image startup. This has multiple advantages, as the image build is a standard JVM it is still possible to use JVM
features such as reflection and dynamic proxy generation that do not work out of the box on Substrate. As most of the
startup is done in this phase the native image will start even faster, as it effectively contains a serialized image of
an already started application.</p>
</dd>
<dt class="hdlist1">Native Image Start</dt>
<dd>
<p>As most of the work has been done in the image build the actual native image startup will generally only contain tasks
that can&#8217;t be done in advance, such as opening sockets and connecting to databases.</p>
</dd>
</dl>
</div>
</div>
</div>
<div class="sect1">
<h2 id="extension-architecture"><a class="anchor" href="#extension-architecture"></a>Extension Architecture</h2>
<div class="sectionbody">
<div class="paragraph">
<p>As a result of this architecture every extension will provide two artifacts, one that handles build time processing (the
<code>-deployment</code> artifacts), and another <code>-runtime</code> artifact that contains the classes needed at runtime. Only the runtime
artifact will end up in the final application. The end result of the deployment process is some generated bytecode that
can directly start any runtime services required by the application (but don&#8217;t worry, you don&#8217;t have to know anything
about bytecode to write a Quarkus extension).</p>
</div>
<div class="paragraph">
<p>Quarkus uses a novel technique for writing bytecode that we are calling <em>Bytecode Recording</em>. Basically at augment
time extensions can inject instances of classes that contain the runtime logic to start services, and invoke these
instances as if they were directly starting the service. These injected instances are actually proxies, that override all
the public methods and record exactly which invocations have been made, what the parameters are, and the order they were
made in. They then generate bytecode to perform this exact same sequence of invocations when the application starts up.</p>
</div>
<div class="paragraph">
<p>This means that from the point of view of an extension developer it looks like they are making invocations that
directly start the application, when in fact they are recording bytecode that will be used to start the application
later.</p>
</div>
<div class="paragraph">
<p>The <code>-deployment</code> artifacts work by defining <code>@BuildStep</code> methods, that produce and consume <code>BuildItem</code> instances, and
can also record bytecode if required.</p>
</div>
</div>
</div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
